using FrameOperateSync;

namespace Pvp
{
    /// <summary>
    /// 核心战斗模块
    ///
    /// 运行两份逻辑
    /// 逻辑1完全基于服务器来驱动，并且不处理任何表现逻辑
    /// 逻辑2基于服务器+本地数据驱动， 客户端表现基于此逻辑
    ///
    /// 每份逻辑每帧循环处理：收集所有输入 =》 解析输入（更改游戏对象状态数据） =》 状态数据驱动游戏逻辑（移动，技能，伤害，buff） =》 游戏逻辑反过来影响游戏数据 =》 根据游戏数据来做表现  
    ///
    /// 逻辑2按时去跟逻辑1保持同步，确保最终渲染的画面能尽量保持连续
    /// </summary>
    sealed class PvpCore : IBehaviour
    {
        private static IPvpGame _entry;
        private static IPvpGame _localEntry;

        protected override void Awake()
        {
            _entry = new PvpEntry(true);
            _localEntry = new PvpEntry(false);
            
        }

        protected override void Start()
        {
            _entry.OnGameStart();
            _localEntry.OnGameStart();
        }

        protected override void FrameUpdate(int renderFrameIndex)
        {
            _entry.OnGameUpdate(renderFrameIndex);
            _localEntry.OnGameUpdate(renderFrameIndex);
        }

        //输入
        public static void ProcessInput(int entityId, bool localFlag, OperateType opType, IRenderData inputData)
        {
            _localEntry.HandleInput(entityId, localFlag, opType, inputData);
            _entry.HandleInput(entityId, localFlag, opType, inputData);
        }
    }
}